博客动态
Hi!欢迎来到Jerry Coding!公众号垃圾分类增加学习功能,关注下面的公众号一起来帮助Jerry学习更多垃圾分类知识吧!
微信扫码

扫一扫关注我

More
关于
New
RSS

C# Winform自动升级(一)版本号校验

2020年11月29日 Jerry 131 2020年12月23日

基本所有的软件都会有自动更新功能,方便解决其中的bug或增添新功能,那自动更新是如何实现的呢?这篇文章开始记录下自己实现的自动更新器。

升级的流程图思路大概如下:

流程图很清楚,接下来搞定具体的实现。

为了直观地实现其中的每一步,我搞了个界面和多个按钮,模拟其中的一步步操作。

升级前先准备好升级XML文件以及升级压缩包:

1、准备好升级的文件,压缩打包并计算出MD5供下载后的校验,随后上传到服务器。我这里压缩包(newfile.zip)就只有一个txt文档,升级的服务器用了网站的CDN服务器。

2、新建了一个XML文件testupdate.xml,内容如下:

<?xml version="1.0" encoding="utf-8" ?>  
<Update> 
   <Soft Name="update"> 
     <Verson>1.0.0.3</Verson>  
     <DownLoad>https://cdn2.jerrycoding.com/newfile.zip</DownLoad>
	 <Md5>9c12161031c2ec9b3c010d945c495ad7</Md5>
  </Soft> 
</Update> 

组成部分一目了然:1)version(字母写错了 已经上传了就懒得改了🤭);2)升级包文件下载地址;3)升级包MD5校验。

当然你可以根据需要随意修改你的XML文件,这里我就以这个简单示例。

3、下载升级XML文件

/// <summary>
/// 下载xml文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
	string url = textBox1.Text;
	WebClient client = new WebClient();

	richTextBox1.AppendText("开始下载XML...");

	try
	{
		g_upxmlname = System.IO.Path.GetFileName(url);
		client.DownloadFile(url, System.Environment.CurrentDirectory + "\\" + g_upxmlname);
		richTextBox1.AppendText("\n下载XML完成!");
	}
	catch (Exception ex)
	{
		richTextBox1.AppendText("\n下载失败,错误" + ex.Message);
	}

}

实现效果:

4、解析下载后的升级文件

/// <summary>
/// XML 解析
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{

	//解析 下载 XML

	XmlDocument doc = new XmlDocument();
	doc.Load(System.Environment.CurrentDirectory + "\\" + g_upxmlname);

	XmlElement root = null;
	root = doc.DocumentElement;


	XmlNodeList nodeList = null;
	nodeList = root.SelectNodes("/Update/Soft");

	foreach (XmlElement el in nodeList)//读元素值 
	{
		List<String> strlist = new List<String>();
		richTextBox1.AppendText("\n下载的xml内容:");
		foreach (XmlNode node in el.ChildNodes)
		{
			richTextBox1.AppendText("\n" + node.Name + ":" + node.InnerText);
			strlist.Add(node.InnerText);
		}
		g_upxml.version = strlist[0];
		g_upxml.url = strlist[1];
		g_upxml.md5 = strlist[2];
	}

	//解析 本地XML

	doc.Load(System.Environment.CurrentDirectory + "\\" + g_localxmlname);

	root = doc.DocumentElement;
	nodeList = root.SelectNodes("/Local/Soft");

	foreach (XmlElement el in nodeList)//读元素值 
	{
		List<String> strlist = new List<String>();
		foreach (XmlNode node in el.ChildNodes)
		{
			richTextBox1.AppendText("\n本地xml内容:\n" + node.Name + ":" + node.InnerText);
			strlist.Add(node.InnerText);
		}
		g_loxml.version = strlist[0];
	}

}

/// <summary>
/// 版本号比较
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button5_Click(object sender, EventArgs e)
{
	richTextBox1.AppendText("\n本地版本号:" + g_loxml.version);
	richTextBox1.AppendText("\n待升级版本号:" + g_upxml.version);
	if (g_loxml.version == g_upxml.version)
	{
		richTextBox1.AppendText("\n版本号一致,无需升级!");
		return;
	}
	else
	{
		richTextBox1.AppendText("\n版本号校验完成,需要升级!");
		return;
	}

}

其中定义了个结构体,保存下解析出的版本号、下载路径及Md5

private struct MyXml_S
{
	public string version;
	public string url;
	public string md5;
};

MyXml_S g_upxml;
MyXml_S g_loxml;

实现效果:

到这就基本完成了XML文件的解析与版本号的校验。

 

实现代码 GITHUB: https://github.com/DreamerLS1994/autoupdater


原创文章,转载请注明出处: https://jerrycoding.com/article/csharp-autoupdate1

微信
支付宝

您尚未登录,暂时无法评论。请先 登录 或者 注册

0 人参与 | 0 条评论

每日一句 (From ONE)
我觉得,我爱这一切,也许这是因为我没有别的什么可爱,或者,即使世上没有什么真的值得任何心灵所爱,多愁善感的我,却必须爱有所及。我可以滥情于区区一个墨水瓶之微,就像滥情于星空中巨大无边的寂冷。
微信扫码

扫一扫关注我

关于本站